我們稍早前介紹過 attribute
的使用方式,今天我們來介紹要怎麼自定義輸入欄位 attribute
的資料型別轉換器吧!
建立自訂轉換器的規則就是,你需要建立一個繼承自ActiveModel::Type::Value
的 class,並根據您的自訂規則,覆寫掉 cast_value
這個方法。
因為轉換器的觸發流程是,他其實會透過 cast
去把 value 再傳到 cast_value
裡面去進行這裡面的動作。那讀者或許會問,為什麼不 overwrite cast
就好呢?
這是因為,cast
會先排除掉值為 nil
的狀況,也就是 nil
的話就不會進 cast_value
而直接回傳 nil
,這對我們撰寫型態轉換 script 來說,就可以少掉一份需要 handle nil 值的工。
接著我們來看範例:
class CustomType < ActiveModel::Type::Value
def cast_value(value)
# 比方說,從前端傳來一包 JSON 的 string,我們要把它 parse 為 Hash
JSON.parse(value)
end
end
# 接著,在您的 class 裡面,就可以這樣做:
class MyClass
include ActiveModel::Model
include ActiveModel::Attributes
attribute :json, CustomType.new
# 把剛建立的轉換器 new 一個固定的 instance (會存在 class 的身上,至於存在哪裡,這之後會講),並指定給 `json` 這個 attribute
end
# 來試驗看看吧!首先建立一個假資料,假設是從前端傳來的 json string
input_json = '{"name":"Frank","age":18}'
form_object = MyClass.new json: input_json
puts form_object.json
印出結果如下:
{"name"=>"Frank", "age"=>18}
轉換成功!
但或許讀者您會覺得,每次都要用自定義的轉換器 class 再 new 一個物件,傳進 attribute
,這樣有點不太優雅...。
下一篇我們來解決這個問題~!